package com.atguigu.tingshu.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 自定义的听书线程池
 *
 * @author Taeyang
 * @date 2025/4/30
 */
@Configuration
public class TingShuThreadPoolConfig {

    /**
     * 自定义线程池
     *
     * @return
     */
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        return new ThreadPoolExecutor(
            // 核心线程
            12,
            // 最大线程：最大线程 = 核心线程 --> 逻辑密集型、最大线程 = 2 * 核心线程 --> IO密集型
            24,
            // 闲置时间
            10,
            // 闲置时间单位
            TimeUnit.SECONDS,
            // 阻塞队列：
            //  有界：数组、链表
            //  无界（永不触发拒绝策略）：链表
            new ArrayBlockingQueue<>(12),
            // 工厂对象
            Executors.defaultThreadFactory(),
            // 拒绝策略
            new ThreadPoolExecutor.AbortPolicy()
            // (a, b) -> {
            //     // 自定义拒绝策略
            // }
        );
    }

    /*
    基础（线程池的膨胀（由任务触发，没有任务不触发）流程）：
        1. 线程池初始化完成，线程池内部的情况为：
            核心线程：0个
            非核心线程：0个
            阻塞队列：0个
        2. 分配12个任务之后，线程池内部的情况为：
            核心线程：12个
            非核心线程：0个
            阻塞队列：0个
        3. 同时分配12（共24）个任务之后，线程池内部的情况为：阻塞队列 > 非核心线程
            核心线程：12个
            非核心线程：0个
            阻塞队列：12个
        4. 再次同时分配12（共36）个任务之后，线程池内部的情况为：非核心线程优先执行触发创建的任务（不公平，优先执行非核心线程而不是阻塞队列）
            核心线程：12个
            非核心线程：12个
            阻塞队列：12个
        5. 再次同时分配n（共36+n）个任务之后，触发拒绝策略：阻塞队列 > 非核心线程 > 拒绝策略
            1. CallerRunsPolicy：任务会被执行，谁分配的谁执行
            2. AbortPolicy（默认）：任务不执行，抛异常
            3. DiscardPolicy：任务不执行，什么都不做（丢弃任务）
            4. DiscardOldestPolicy：等待时间最久的任务被丢弃，新任务进入线程池
            5. 自定义：?
    源码部分（线程池创建线程的流程和最大线程数）：
     */
}
